/*
 * @Author: lhl 1079161148@qq.com
 * @Date: 2024-04-04 16:35:34
 * @LastEditors: lhl 1079161148@qq.com
 * @LastEditTime: 2024-04-06 21:27:17
 * @FilePath: \net-cloud-music\src\utils\request.ts
 * @Description: axios二次封装
 */
import axios from 'axios'
import type { AxiosRequestConfig, AxiosResponse, AxiosError } from 'axios'
import { showToast } from 'vant'
import router from '@/router/index'

// 创建axios实例
const instance = axios.create({
  // 设置API的基础URL
  baseURL: import.meta.env.VITE_APP_BASE_URL,
  // 超时时间 30s
  timeout: 30 * 1000,
  // 携带跨域凭证
  withCredentials: true //关键
})

/**
 * 跳转登录页
 * 携带当前页面路由，以期在登录页面完成登录后返回当前页面
 * router.currentRoute是ref响应式数据
 */
const toLogin = () => {
  router.replace({
    path: '/login',
    query: {
      redirect: router.currentRoute.value.fullPath
    }
  })
}

// 请求拦截器
instance.interceptors.request.use(
  (config: AxiosRequestConfig): any => {
    // 可在请求发送前对config进行修改，如添加请求头等
    const headers = config.headers || {}
    headers['Authorization'] = 'Bxxx'
    config.headers = headers
    return config
  },
  (error: AxiosError) => {
    // 处理请求错误
    return Promise.reject(error)
  }
)

// 响应拦截器
instance.interceptors.response.use(
  (response: AxiosResponse) => {
    console.log(response, 'AxiosResponse')

    // 对响应数据进行处理
    const { code, msg } = response.data
    if (code === 200) {
      return response.data
    } else if (response.data instanceof ArrayBuffer) {
      // 响应数据为二进制流处理(Excel导出)
      return response
    } else {
    }
  },
  (error: AxiosError) => {
    console.log(error, 'error错误信息')
    const { code, message } = error
    // token 过期,重新登录
    if (code === '401') {
      toLogin()
    } else {
      showToast(message || '系统出错')
    }

    // 网络连接失败
    if (!window.navigator.onLine) {
      showToast('网络连接失败')
      // 可以跳转到错误页面(网络中断的页面)，也可以不做操作
    }
    // 处理响应错误
    return Promise.reject(error)
  }
)

export default instance
